/**
 * @file mod_master_91A.c
 * @author Linquan  
 * @brief 
 * @version 1.0
 * @date 2024-08-30
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include "mod_master_91A.h"
#include <string.h>

/*=======================函数声明===============================*/


/** IO function ： */
static uint8_t find_node(circuit_node_t *node_ptr, void *argPtr);
static uint8_t event_list_add(circuit_node_t *node_ptr, void *argPtr);
static uint8_t get_event_list(circuit_node_t *node_ptr, void *argPtr);
/*=======================end===============================*/


/**
 * @brief 91A复位
 * @param node_ptr 端点指针
*/
static void OP_FUNC_RESET(TYPE_CTR_CW1320_91A)(void *node_ptr)
{
    // // 1、 转换节点类型
    // circuit_node_t*  temp_node = (circuit_node_t*)node_ptr;

    // // 2、 为节点的独有状态和 配置信息创建空间
    // temp_node->node_rt_data     = malloc(sizeof(RT_DATA_TYPE(TYPE_CTR_CW1320_91A)));
    // temp_node->node_config_data = malloc(sizeof(CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A)));

    // /**> 3、初始化 独有实时状态 */
    // {
    //     memset();

    //     // 3.1获得节点的独有状态指针
    //     RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *rt_91A_ptr = \
    //                     (RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *)temp_node->node_rt_data;

    //     // 3.2、创建 独有状态链表指针,指向该节点的链表头
    //     list_head_node *list = &rt_91A_ptr->gas_exth_zone_1.gas_zone_event_list;

    //     // 3.3为链表分配空间
    //     uint8_t* gas_zone_event_buff = (uint8_t*)malloc(sizeof(report_data_t)*GAS_ZONE_UPDATE_DATA_MAX);

    //     // 3.4 初始化链表头空间
    //     list_init_withbuf(list ,\
    //                     gas_zone_event_buff, sizeof(report_data_t)*GAS_ZONE_UPDATE_DATA_MAX) ;


    
    // }
   
}

/**
 * @brief 91A初始化数据
*/
static uint32_t OP_FUNC_INIT(TYPE_CTR_CW1320_91A)(void *node_ptr, void *config_data_ptr)
{
    uint32_t res = (INIT_NEED_REQUEST + INIT_NEED_CHECK_OFFLINE);
    
    if(node_ptr == NULL)
    {
        error_log("ptr is null\n");
        res += INIT_ERR_NODE_NULL;
        return res;
    }
  
    /**> 1、转换类型*/
    circuit_node_t  *temp_node = (circuit_node_t*)node_ptr;             /**> 节点指针 */
    cfg_node_info_t *cfg_info = (cfg_node_info_t*)config_data_ptr;      /**> 配置信息 */


    if(cfg_info->node_type != TYPE_CTR_CW1320_91A)
    {
        error_log("node type:%#X is error ,should %#X \n", cfg_info->node_type,TYPE_CTR_CW1320_91A);
        res += INIT_ERR_TYPE;
        return res;
    }


    /**> 2、 为节点的独有状态和 配置信息创建空间 */ 
    temp_node->node_rt_data     = calloc(1, sizeof(RT_DATA_TYPE(TYPE_CTR_CW1320_91A)));
    temp_node->node_config_data = calloc(1, sizeof(CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A)));

    
    /**> 3、初始化 独有实时状态 */
    {
        // 3.1获得节点的独有状态指针
        RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *rt_91A_ptr = \
                        (RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *)temp_node->node_rt_data;

        // 3.2、创建 独有状态链表指针,指向该节点的链表头
        list_head_node *list = &rt_91A_ptr->gas_exth_zone_1.gaszone_evt_list;

        // 3.3为链表分配空间
        uint8_t* gas_zone_event_buff = (uint8_t*)malloc(sizeof(LIST_NODE_TYPE(REPORT_DATA_91A))*GAS_ZONE_UPDATE_DATA_MAX);

        // 3.4 初始化链表头空间
        list_init_with_buff(list ,\
                            gas_zone_event_buff,\
                            sizeof(LIST_NODE_TYPE(REPORT_DATA_91A))*GAS_ZONE_UPDATE_DATA_MAX,\
                            sizeof(LIST_NODE_TYPE(REPORT_DATA_91A))\
                            ) ;
    
    }

    // debug_log("91A config is start \n");
    
    /**> 4、存储 配置信息 */
    {
        /**> ！！！ 转换类型，必须在config_data 分配空间之后才能进行 ！！！*/
        CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A) *temp_cfg_para =\
                        (CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A)*) temp_node->node_config_data;

        /**> 4.1 填充地址 */
        temp_node->node_addr.circuit_ID = cfg_info->dev_addr.circuit_ID;
        temp_node->node_addr.circuit_node_index = cfg_info->dev_addr.circuit_node_index;
      
        /**> 4.1 填充 设备描述 ,这里需要使用strdup 函数，
         *      自动分配一块空间用于存字符串.
         *    ！！！不可以直接赋值 ！！！
         * */
        temp_node->dev_description = strdup(cfg_info->dev_description);
        /**> 4.1 填充 设备类型 */
        temp_node->node_type = cfg_info->node_type;
       /**> 4.1 填充 配置文件名称 */
        temp_cfg_para->config_file_name = strdup(cfg_info->config_para[PARA_1]);

    }
    

    return  res;
}


/**
 * @brief 91A的IO操作
 * @param vPtr 端点指针
 * @param ucCommand 控制命令
 * @param argPtr 参数
 * @return int32_t 返回0表示成功，返回1表示失败
 * @attention
 */
static int32_t OP_FUNC_IO_CTR(TYPE_CTR_CW1320_91A)(void *node_ptr, operate_code_t Command, void *argPtr)
{
    int32_t ret = OP_FAIL_PTR_NULL;
    circuit_node_t *temp_node;
 
    if(node_ptr == NULL)
    {
       return ret;
    }

    temp_node = (circuit_node_t*)node_ptr;

    if (temp_node->node_type != TYPE_CTR_CW1320_91A)
    {
        ret = OP_TYPE_ERR;
        return ret;
    }
    
    switch (Command)
    {
        case OP_CODE_FIND_NODE:
            ret = find_node(temp_node, argPtr);
        break;

        case OP_CODE_90A_EVENT_LIST_ADD:
            ret = event_list_add(temp_node, argPtr);
        break;
    
        // case OP_CODE_90A_EVENT_LIST_GET:
        //      ret = get_event_list(temp_node, argPtr);
        // break;


        default:
            ret = OP_NOT_SUPPORT;
        break;
    }

    return ret;
}

/**
 * @brief 91A请求
 * @param vPtr 端点指针
 */
static void OP_FUNC_TIMING_REQUEST(TYPE_CTR_CW1320_91A)(void *node_ptr)
{
    return;
}




/**
 * @brief 91A协议解析
 * @param node_ptr 端点
 * @param eProtKind 协议类型
 * @param vDatPtr 数据
 * @param usLen 数据长度
 * @return int32_t 返回-1表示不支持协议类型，返回1表示无法解析，返回0表示成功
 */
static int32_t OP_FUNC_PROTPARSE(TYPE_CTR_CW1320_91A) (void *node_ptr, really_circuit_kind_t eProtKind,
                                                        void *vDatPtr, uint16_t usLen)
{
  
}




/**
 * @brief 设备接口
 */
 node_operate_irf_t OP_FUNC_IRF(TYPE_CTR_CW1320_91A) = {
    .irfInit        = OP_FUNC_INIT(TYPE_CTR_CW1320_91A),
    .irfReset       = OP_FUNC_RESET(TYPE_CTR_CW1320_91A) ,
    .irfIoCtrl      = OP_FUNC_IO_CTR(TYPE_CTR_CW1320_91A),   
    .irfRequest     = OP_FUNC_TIMING_REQUEST(TYPE_CTR_CW1320_91A),  
    .irfProtParse   = OP_FUNC_PROTPARSE(TYPE_CTR_CW1320_91A),
};


/*************************************************************************** 
                    IO OPERATION API
****************************************************************************/

/**
 * @brief 根据传入的节点，找到指定地址的下一个节点并返回
 * 
 * @param node_ptr 
 * @param argPtr 
 * @return int 
 */
static uint8_t find_node(circuit_node_t *node_ptr, void *argPtr)
{
    if (node_ptr == NULL || argPtr == NULL)
    {
        error_log("91A find node: node_ptr or argptr is null \n");
        return OP_FAIL_PTR_NULL;
    }
    
    muti_addr_t *addr           = (muti_addr_t *)argPtr;
    uint32_t ID         = addr->addr_arry_ptr->circuit_ID;          /* 回路ID */
    uint32_t node_index = addr->addr_arry_ptr->circuit_node_index;  /*  回路节点索引号 */ 
    
    /**> 清空 node ptr的值，便于进行错误判断 */
    addr->node_ptr = NULL;

    CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A) *config_data;
    config_data = (CONFIG_INFO_TYPE(TYPE_CTR_CW1320_91A)*)node_ptr->node_config_data;

    if (ID > MOD_91A_CIRCUIT_MAX) 
    {   
        error_log("circuit id is %#X. it's big than 91A circuit id max\n",ID);
        return OP_FAIL_OVERSTEP;
    }

    /** 根据传入地址，找到目标节点，节点指针指向新的目标节点位置 */
    if(node_index < config_data->mod_91a_node_tree_ptr[ID].branch_node_number)
    {
        addr->node_ptr = &config_data->mod_91a_node_tree_ptr[ID].branch_ptr[node_index];
    }
    else
    {
       // 遍历
        for(int i = 0; i < config_data->mod_91a_node_tree_ptr[ID].branch_node_number; i ++)
        {
            if (config_data->mod_91a_node_tree_ptr[ID].branch_ptr[i].node_addr.circuit_node_index\
                 ==  node_index)
            {
                addr->node_ptr = &config_data->mod_91a_node_tree_ptr[ID].branch_ptr[i];             
                break;
            }
        }
    }

    if(addr->node_ptr == NULL)
    {
        error_log("node is not find, the node ptr is null \n");
        return OP_FAIL_PTR_NULL;
    }

    /** 更新 节点地址信息 */
    addr->addr_arry_ptr += 1 ;          /** 地址级数剥离两位 */
    addr->addr_num      -= 1;           /** 地址指针偏移两位 */

    return OP_SUCCESS;
}




static uint8_t event_list_add(circuit_node_t *node_ptr, void *argPtr)
{
     if (node_ptr == NULL || argPtr == NULL)
    {
        error_log("91A  event_list_add: node_ptr or argptr is null \n");
        return OP_FAIL_PTR_NULL;
    }

    report_data_t *event_data = ( report_data_t *)argPtr;
    RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *rt_91A = node_ptr->node_rt_data;
    
    list_head_node *list = &rt_91A->gas_exth_zone_1.gaszone_evt_list;

    LIST_WRITE(REPORT_DATA_91A)(list,HEAD_ADD, *event_data);

    return OP_SUCCESS;
}



// static uint8_t get_event_list(circuit_node_t *node_ptr, void *argPtr)
// {
//     RT_DATA_TYPE(TYPE_CTR_CW1320_91A) *rt_91A = node_ptr->node_rt_data;
//     list_head_node *list = &rt_91A->gas_exth_zone_1.gaszone_evt_list;

//     list_head_node * list_convert = (list_head_node *)argPtr;
//     list_convert = list;
    
//     return OP_SUCCESS;
// }









